package com.bnz.manager.service.impl;

import com.bnz.manager.dao.SpecificationOptionDao;
import com.bnz.manager.entity.SpecificationOptionEntity;
import com.bnz.manager.group.Specification;
import org.apache.commons.lang.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.bnz.utils.PageUtils;
import com.bnz.utils.Query;

import com.bnz.manager.dao.SpecificationDao;
import com.bnz.manager.entity.SpecificationEntity;
import com.bnz.manager.service.SpecificationService;


@Service("specificationService")
public class SpecificationServiceImpl extends ServiceImpl<SpecificationDao, SpecificationEntity> implements SpecificationService {

    // 引入添加规格dao
    @Autowired
    private SpecificationOptionDao specDao;

    // 1、分页待条件查询
    @Override
    public PageUtils queryPage(Map<String, Object> params) {
        // 1.1、获取前端传入的参数key
        Object key = params.get("key");
        // 1.2、定义查询条件
        QueryWrapper<SpecificationEntity> wrapper = new QueryWrapper<>();
        // 1.3、判断传入的参数是否为空
        if (!StringUtils.isEmpty(key.toString())) { // 参数不为空（转为字符串）
            // 1.4、根据名称进行模糊查询，id进行查询，字段名要和数据库一致
            wrapper.like("spec_name", key).or().like("id", key);
        }
        // 1.5、开始进行分页
        IPage<SpecificationEntity> page = this.page(
                new Query<SpecificationEntity>().getPage(params),
                wrapper // 查询的条件信息（参数）
        );

        return new PageUtils(page);
    }


    // 2、添加规格
    @Override
    public void save(Specification specification) {
        // 2.1、添加规格选项 SpecificationEntity里的id为规格id，有规格名字(获取规格id与名称)
        SpecificationEntity spec = specification.getSpec();// SpecificationEntity实体类有 id spec_name
        // 2.2、spec是SpecificationEntity实体类对象，有规格id，规格名称
        baseMapper.insert(spec);// 添加，选择规格
        System.out.println("规格id：" + spec.getId());
        // 2.3、添加完成后，便可以得到规格的id,将此id和规格选项绑定(先遍历出每个要添加的)
        // options:将SpecificationOptionEntity实体类放进list集合，有：id,option_name,spec_id,orders
        for (SpecificationOptionEntity option : specification.getOptions()) {
            // 2.3.1、设置规格选项的外键（两表相关联的字段spec_id）
            option.setSpecId(spec.getId());// 设置规格id
            // 2.3.2、添加规格选项(用规格添加的dao)
            specDao.insert(option);
        }

    }

    // 3、根据id查询出规格，规格选项列表
    @Override
    public Specification findById(String id) {
        // 3.1、根据id查询出规格（tb_specification表）
        SpecificationEntity specId = baseMapper.selectById(id);
        // 3.2、根据规格id查询出规格选项（tb_specification_option表）
        // 3.2.1、要查的是别的表，用其引入的dao
        List<SpecificationOptionEntity> selectList = specDao.selectList(new QueryWrapper<SpecificationOptionEntity>().eq("spec_id", specId.getId()));
        // 3.3、返回
        return new Specification(specId,selectList);
    }

    // 4、修改（两个表相关联，有些数据改了都会改） 先删除再把数据添加进去，完成修改
    @Override
    public void update(Specification specification) {
        // 4.1、先根据id修改规格（tb_specification表）
        baseMapper.updateById(specification.getSpec());
        // 4.2、再根据外键id（也就是两表相关联的spec_id），在规格选项表（tb_specification_option表）删除原来的所有规格列表
        // 不是本表，要用到引入的dao  eq->比对spec_id
        specDao.delete(new QueryWrapper<SpecificationOptionEntity>().eq("spec_id",specification.getSpec().getId()));
        // 4.3、重新添加规格列表
        // 4.3.1、遍所查到的数据(tb_specification_option表的数据)
        for (SpecificationOptionEntity option : specification.getOptions()) {
            // 4.3.2、为规格列表设置规格id(两表相关联的id)
            option.setSpecId(specification.getSpec().getId());
            // 4.3.3、将数据添加进去(tb_specification_option表)
            specDao.insert(option);
        }
    }

    // 5、批量删除
    @Override
    public void removeAll(List<String> ids) {
        for (String id : ids) {
            // 5.1、删除规格选项(tb_specification_option表的数据),别的表，要用引入的dao
            // 这一步是删除里面通过spec_id关联的数据（tb_specification_option表的数据）
            specDao.delete(new QueryWrapper<SpecificationOptionEntity>().eq("spec_id",id));
            // 5.2、删除规格（tb_specification表）
            baseMapper.deleteById(id);
        }
    }

}